import schedulegui.data.InfoItem;
import java.util.*;

/**
 * Abstract class Optreden - Deze klasse stelt een algemeen optreden voor waarvan de specifieke
 * soorten optredens een deel van hun functionaliteit erven.
 * 
 * @author Eric de Potter de ten Broeck
 * @version 5/4/2011
 */
public abstract class Optreden implements InfoItem
{
    private String title;
    private Date startTime;
    private String description;
    private String stage;
    private Set<Gebruiker> likes;
    
    /**
     * De constructor van de abstracte klasse Optreden.
     */
    public Optreden(Date startTime, String description, String stage, String title)
    {
        this.startTime = startTime;
        this.description = description;
        this.stage = stage;
        this.title = title;
        likes = new HashSet<Gebruiker>();
        
    }
    
    /**
     * Gaat na of de huidige gebruiker het optreden bijwoont
     * 
     * @return  true als de gebruiker het optreden bijwoont anders false
     */
    public boolean isAttending()
    {
        if (Database.getCurrentUser() != null) {
            List<Optreden> optredens = Database.getCurrentUser().getOptredens();
            if (optredens.contains(this))
                return true;
            else {
                for (Optreden optreden : optredens) {
                    if (optreden.toString().equals(this.toString())) {
                        return true;
                    }
                }
            }
            return false;
        }
        return false;
    }
    
    /**
     * Voegt de gebruiker toe aan de lijst van gebruikers die het optreden leuk vinden
     * 
     * @param  user  de gebruiker die het optreden leuk vindt
     */
    public boolean like(Gebruiker user)
    {
        return likes.add(user);
    }
    
    /**
     * Verwijdert de gebruiker van de lijst van gebruikers die het optreden leuk vinden
     * 
     * @param user  de gebruiker die eerst het optreden leuk vond en nu niet meer
     */
    public boolean dislike(Gebruiker user)
    {
        return likes.remove(user);
    }
    
    /**
     * @return  de hele lijst van gebruikers die het optreden leuk vinden terug
     */
    public Set<Gebruiker> getLikes()
    {
        return likes;
    }
    
    /**
     * Gaat na of de huidige gebruiker het optreden leuk vindt of niet.
     * 
     * @return  true als de gebruiker het optreden leuk vindt anders false
     */
    public boolean isLiked()
    {
        if (Database.getCurrentUser() != null) {
            for (Gebruiker user: likes) {
                if (Database.getCurrentUser().equals(user))
                    return true;
                else if (Database.getCurrentUser().getName().equals(user.getName()))
                    return true;
            }
            return false;
        }
        return false;
    }
    
    /**
     * Retourneert het podium waar het optreden plaatsvindt.
     * 
     * @return   het podium waar het optreden plaatsvindt.
     */
    public String getStage()
    {
        return stage;
    }
    
    /**
     *@return  de beschrijving van het optreden
     */
    public String getDescription()
    {
        return description;
    }
    
    /**
     * @return de titel van het optreden
     */
    public String getTitle()
    {
        return title;
    }
    
    /** 
     * @return   de starttijd van het optreden als een date object.
     */
    public Date getStartDate()
    {
        return startTime;
    }
    
    /**
     * @return   de stoptijd van het optreden.
     */
    public abstract Date getStopDate();
    
    /**
     * @return  het genre van het optreden
     */
    public abstract String getGenre();
    
    /**
     * Zet een integer om in een string met 2 entries
     * 
     * @return  een string van de vorm "00"
     */
    protected String toDouble(int number)
    {
        if (number < 10) 
            return "0" + number;
        else
            return "" + number;
    }
}
